<!DOCTYPE HTML>
<html>
<head>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body id="a">
<script>
test(() => {
  assert_equals(document.getElementById("a"), document.body);
  assert_equals(document.body.id, "a");
  assert_equals(document.body.getAttributeNode("id").value, "a");
}, "Test that different ways of changing an element's id all work properly, 1. Check id after parsing");

test(() => {
  document.body.getAttributeNode("id").value = "b";
  assert_equals(document.getElementById("a"), null);
  assert_equals(document.getElementById("b"), document.body);
  assert_equals(document.body.getAttributeNode("id").value, "b");
}, "Test that different ways of changing an element's id all work properly, 2. Change Attr.value");

test(() => {
  document.body.id = "c";
  assert_equals(document.getElementById("b"), null);
  assert_equals(document.getElementById("c"), document.body);
  assert_equals(document.body.getAttributeNode("id").value, "c");
}, "Test that different ways of changing an element's id all work properly, 3. Change HTMLElement.id");

test(() => {
  document.body.setAttribute("id", "d");
  assert_equals(document.getElementById("c"), null);
  assert_equals(document.getElementById("d"), document.body);
  assert_equals(document.body.getAttributeNode("id").value, "d");
}, "Test that different ways of changing an element's id all work properly, 4. Change id attribute via setAttribute()");

test(() => {
  document.body.setAttributeNS(null, "id", "e");
  assert_equals(document.getElementById("d"), null);
  assert_equals(document.getElementById("e"), document.body);
  assert_equals(document.body.getAttributeNode("id").value, "e");
}, "Test that different ways of changing an element's id all work properly, 5. Change id attribute via setAttributeNS()");

test(() => {
  var attrNode = document.body.getAttributeNode("id");
  document.body.getAttributeNode("id").nodeValue = "f";
  assert_equals(document.getElementById("e"), null);
  assert_equals(document.getElementById("f"), document.body);
  assert_equals(document.body.id, "f");
  assert_equals(document.body.getAttribute("id"), "f");
  assert_equals(attrNode.value, "f");
}, "Test that different ways of changing an element's id all work properly, 6. Change Attr.nodeValue");

test(() => {
  var attrNode = document.body.getAttributeNode("id");
  attrNode.value = "hi";
  assert_equals(document.getElementById("i"), null);
  assert_equals(document.getElementById("hi"), document.body);
  assert_equals(document.body.id, "hi");
  assert_equals(document.body.getAttribute("id"), "hi");
  assert_equals(attrNode.value, "hi");
}, "Test that different ways of changing an element's id all work properly, 12. Chnaging Attr.value");

test(() => {
  var attrNode = document.body.getAttributeNode("id");
  document.body.removeAttributeNode(attrNode);
  assert_equals(document.body.id, "");
  assert_equals(document.getElementById("mn"), null);
  assert_equals(document.body.getAttribute("id"), null);
  assert_equals(document.body.getAttributeNode("id"), null);
}, "Test that different ways of changing an element's id all work properly, 21. Remove an Attr node");

test(() => {
  var attrNode = document.createAttribute("id");
  attrNode.value = "o";
  document.body.setAttributeNode(attrNode);
  assert_equals(document.getElementById("o"), document.body);
  assert_equals(document.body.id, "o");
  assert_equals(document.body.getAttribute("id"), "o");
}, "Test that different ways of changing an element's id all work properly, 22. Add an Attr node");

test(() => {
  var attrNode = document.createAttribute("id");
  attrNode.value = "p";
  document.body.setAttributeNode(attrNode);
  assert_equals(document.getElementById("o"), null);
  assert_equals(document.getElementById("p"), document.body);
  assert_equals(document.body.id, "p");
  assert_equals(document.body.getAttribute("id"), "p");
}, "Test that different ways of changing an element's id all work properly, 23. Add an Attr node over an existing one");
</script>
</body>
</html>
